package controllerInterfaces;

import java.util.List;

import model.Subject;
import modelInterfaces.IEventType;
import modelInterfaces.ISubject;
import pluginInterfaces.IRecommender;
import controller.ControllerMain;
import controller.ControllerRunSetup;

/**
*
* Interface of {@link ControllerRunSetup} controller class according to Abstract Factory design pattern.
*/
public interface IControllerRunSetup extends IFrameController {
	
	/**
	 * Set the MVC++ Main Class for this controller.</br>
	 * ControllerMain is manipulable through {@link IControllerMain} interface
	 * @param	controllerMain	MVC++ Main Controller
	 * @see	ControllerMain
	 * @see IControllerMain
	 */	
	public void SetMainController(IControllerMain controllerMain);

	
	/**
	 * Sets the recommendation algorithm setup ({@link Recommender}}) to run.</br>
	 * {@link Recommender} is manipulable though {@link IRecommender} interface.
	 * @param	recommender	the recommendation algorithm setup
	 * @see Recommender
	 * @see IRecommender
	 */
	public void SetRecommender(IRecommender recommender);

	
	/**
	 * Sets the {@link Subject} to provide him recommendations</br>
	 * {@link Subject} is manipulable though {@link ISubject} interface.
	 * @param	currentUser	target subject
	 * @see Subject
	 * @see ISubject
	 */	
	public void SetCurrentUser(ISubject currentUser);

	
	/**
	 * Sets the Number of objects to recommend.
	 * @param	itemsAmountToRecommend	number of objects to recommend.
	 */		
	public void SetItemAmountToRecommend(int itemsAmountToRecommend);

	
	/**
	 * Sets the {@link EventType} list to provide him recommendations</br>
	 * {@link EventType} is manipulable though {@link IEventType} interface.
	 * @param	eventTypes	list of event types to consider in recommendation
	 * @see EventType
	 * @see IEventType
	 */	
	public void SetEventTypes(List<IEventType> eventTypes);
	
	
	/**
	 * Execute the {@link Recommender}
	 */	
	public void run();

	
}
